package com.yuyou.fn.educational.service.impl;

import com.github.wens.framework.service.impl.SuperServiceImpl;
import com.github.wens.mybatisplus.examples.Example;
import com.github.wens.mybatisplus.plugins.Page;
import com.yuyou.fn.common.exception.BusException;
import com.yuyou.fn.common.util.BeanUtils;
import com.yuyou.fn.common.util.CriteriaUtils;
import com.yuyou.fn.common.util.Principals;
import com.yuyou.fn.common.util.TimeUtils;
import com.yuyou.fn.educational.entity.CourseClass;
import com.yuyou.fn.educational.entity.Questionnaire;
import com.yuyou.fn.educational.entity.QuestionnaireSetting;
import com.yuyou.fn.educational.mapper.QuestionnaireMapper;
import com.yuyou.fn.educational.service.ICourseClassService;
import com.yuyou.fn.educational.service.IQuestionnaireQuestionService;
import com.yuyou.fn.educational.service.IQuestionnaireService;
import com.yuyou.fn.educational.service.IQuestionnaireSettingService;
import com.yuyou.fn.educational.vo.NaireSettingQueryVo;
import com.yuyou.fn.educational.vo.QuestionnaireDetailVo;
import com.yuyou.fn.educational.vo.QuestionnaireQueryVo;
import com.yuyou.fn.educational.vo.QuestionnaireSaveUpdateVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 *
 * Questionnaire 表数据服务层接口实现类
 *
 */
@Service
public class QuestionnaireServiceImpl extends SuperServiceImpl<QuestionnaireMapper, Questionnaire,Long> implements IQuestionnaireService {

    @Resource
    private IQuestionnaireSettingService questionnaireSettingService;

    @Resource
    private ICourseClassService courseClassService;

    @Resource
    private IQuestionnaireQuestionService questionnaireQuestionService;

    @Override
    public Page<Questionnaire> findPageByQueryVo(QuestionnaireQueryVo questionnaireQueryVo, int pageNo, int pageSize) {
        Example<Questionnaire> example=Questionnaire.createExample();
        Example.Criteria criteria=example.createCriteria();
        CriteriaUtils.fillCondition(criteria,questionnaireQueryVo);
        example.orderBy("createTime").desc();
        return this.findPageByExample(example,pageNo,pageSize);
    }

    @Override
    public Questionnaire findQuestionnaireByQueryVo(QuestionnaireQueryVo questionnaireQueryVo) {
        Example<Questionnaire> example=Questionnaire.createExample();
        Example.Criteria criteria=example.createCriteria();
        CriteriaUtils.fillCondition(criteria,questionnaireQueryVo);
        return this.findOneByExample(example);
    }

    @Override
    public void saveOrUpdate(QuestionnaireSaveUpdateVo questionnaireSaveUpdateVo) {
        if(StringUtils.isEmpty(questionnaireSaveUpdateVo.getQuestionnaireName())){
            throw new BusException("问卷名称不能为空");
        }
        QuestionnaireQueryVo questionnaireQueryVo=new QuestionnaireQueryVo();
        questionnaireQueryVo.setAreaTeamId(questionnaireSaveUpdateVo.getAreaTeamId());
        questionnaireQueryVo.setRealName(questionnaireSaveUpdateVo.getQuestionnaireName());
        Questionnaire check= this.findQuestionnaireByQueryVo(questionnaireQueryVo);
        if (check!=null && !check.getQuestionnaireId().equals(questionnaireSaveUpdateVo.getQuestionnaireId())){
            throw new BusException("该问卷名称已存在");
        }
        Questionnaire questionnaire=new Questionnaire();
        BeanUtils.copyProperties(questionnaire,questionnaireSaveUpdateVo);
        Principals.Principal principal=Principals.get();
        questionnaire.setUpdateTime(TimeUtils.now());
        questionnaire.setOperatorId(principal.id);
        questionnaire.setOperatorName(principal.name);
        if (questionnaire.getQuestionnaireId()!=null){
            this.checkByQuestionnaireId(questionnaire.getQuestionnaireId());
            this.updateSelectiveById(questionnaire);
        }else {
            questionnaire.setCreateTime(TimeUtils.now());
            this.insert(questionnaire);
        }


    }

    @Override
    @Transactional
    public void deleteByQuestionnaireId(Long questionnaireId) {
        if (questionnaireId==null){
            throw new NullPointerException();
        }
        this.checkByQuestionnaireId(questionnaireId);
        this.deleteById(questionnaireId);
    }

    private void checkByQuestionnaireId(Long questionnaireId){
        QuestionnaireSetting questionnaireSetting=questionnaireSettingService.findByQuestionnaireId(questionnaireId);
        if (questionnaireSetting!=null){
            throw new BusException("该问卷已被应用，无法编辑或删除");
        }
    }

    @Override
    public QuestionnaireDetailVo findClassQuestionnaireDetail(Long classId) {
        QuestionnaireDetailVo questionnaireDetailVo=new QuestionnaireDetailVo();
        CourseClass courseClass=courseClassService.findById(classId);
        questionnaireDetailVo.setCourseClass(courseClass);
        NaireSettingQueryVo naireSettingQueryVo=new NaireSettingQueryVo();
        naireSettingQueryVo.setPeriodId(courseClass.getPeriodId());
        naireSettingQueryVo.setCampusId(courseClass.getCampusId());
        naireSettingQueryVo.setGradeId(courseClass.getGradeId());
        naireSettingQueryVo.setSubjectId(courseClass.getSubjectId());
        QuestionnaireSetting questionnaireSetting=questionnaireSettingService.findSettingByQueryVo(naireSettingQueryVo);
        if (questionnaireSetting==null || questionnaireSetting.getUseQuestionnaireId()==null){
            throw new BusException("该班级暂时未设置问卷，请前往设置");
        }
        questionnaireDetailVo.setQuestionnaire(this.findById(questionnaireSetting.getUseQuestionnaireId()));
        questionnaireDetailVo.setQuestionnaireQuestionList(questionnaireQuestionService.findListByQuestionnaireId(questionnaireSetting.getUseQuestionnaireId()));
        return questionnaireDetailVo;
    }
}